با عرض سلام و وقت بخیر خدمت دوستان گرام.
پروژه دوم درس استاد نورمحمدی(ریزپردازنده): ساخت ساعت دیجیتالی با امکان انتخاب ساعت ، دقیقه ، ثانیه و تغییر هر کدام از آنها.
المانهای مورد نیاز:
1-میکرو کنترلر Atmega32
2-شش عدد سون سگمنت کاتد مشترک
3-شش عدد ترانزیستور BC546
4-هشت عدد مقاومت 220 اهم
5-شش عدد مقاومت 10 اهم
7-کریستال 11.0592Mhz
8-چهار عدد LED(رنگ دلخواه)
9-خازن 220mF – 16v
10-دو عدد کلید فشاری(Push Button)
توضیح عملکرد مدار:
سون سگمنت ها که توسط PORTA مقداردهی میشوند (به روش T.D.M) که برای انتخاب سون سگمنت مورد نظر از PORTD استفاده میکنیم.
کلید فشاریی که به PORTC.1 متصل شده برای انتخاب یکی از قسمتهای ساعت ، دقیقه یا ثانیه بکار میرود.
کلید دوم که به PORTC.3 متصل شده وقتی کاربرد دارد که توسط کلید اول یکی از قسمتهای ساعت (ساعت،دقیقه،ثانیه)انتخاب شده باشد که برای افزایش مقدار آن بکار میرود.
البته برنامه ای که بنده نوشته ام به هیچ عنوان بهینه نیست ، خواهشمندم هر کدام از دوستانی که برنامه را نگاه میکنند(یا استفاده) حتما مشکلش را پیدا کرده و در قسمت نظرات بنویسند.(البته خودم پیداش کردم ولی هنوز درستش نکردم به محض درست شدن برنامه جدید رو براتون میذارم).
توصیه: مطمئنا با تفکر بر روی این برنامه رمز خواندن کلیدها ، همزمان با روش T.D.M را خواهید فهمید(راهنمایی:مشکل این برنامه در خواندن کلید هاست و راهنمایی دوم اینکه روش T.D.M را باید به طریق دیگری پیاده سازی کرد).
موفق باشید
شماتیک مدار رو از لینک زیر بردارید:
http://www.up.ma/images/2ptq872sazwfaxcjbzo9.jpg
اینم برنامش:
#include <delay.h>
#include <mega32.h>
#include <stdlib.h>
int a,b,c,d,e,f,i,j,x;
char number[10]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF}; // BCD for katod moshtarak
unsigned char key,tim1,en1,en2,en3,s=0;
void main(void)
{
DDRA=0x7f; DDRD=0x3f; DDRC=0xf5;
a=0;b=5;c=9;d=5;e=3;f=2;
DDRC.1=0; PORTC.1=1;
DDRC.3=0; PORTC.3=1;
x=10; tim1=x; j=900;
TCCR0=0x02;
TCNT0=131;
TIMSK=0x01;
#asm("sei")
en1=1;en2=1;en3=1;
while(1)
{
delay_ms(10);
while(PINC.1 != 0)
{
if(s>0)
{
key=1; key=PINC.3; delay_ms(8);
if(key==0)
{
if(s==1)
{
a++;
if(a>9)
{
a=0;
b++;
if(b*10+a>=60)
b=0;
}
}
if(s==2)
{
c++;
if(c>9)
{
c=0;
d++;
if(d*10+c>=60)
d=0;
}
}
if(s==3)
{
e++;
if((e>9)|(f>=2 & e>=4))
{
e=0;
f++;
if((f*10+e>=24)|(f>2))
{
f=0; e=0;
}
}
}
} // key==0
}//s>0
} // while
delay_ms(10);
s++;
if(s>0 & j!=400)
j=400;
if(s==1)
{
en1=1;
en2=0;
en3=0;
}
else
if(s==2)
{
en2=1;
en1=0;
en3=0;
}
else
if(s==3)
{
en3=1;
en1=0;
en2=0;
}
else
if(s>=4)
{
j=900;
s=0;
en1=1;
en2=1;
en3=1;
}
}
}// end of main
interrupt [TIM0_OVF] void T0_isr(void)
{
TCNT0=131;
tim1--;
if(tim1==0)
{
tim1=x;
if((en1==1)&(en2==1)&(en3==1))
PORTC.0=!PORTC.0;
else
PORTC.0=0;
for(i=0;i<=j;i++)
{
if(en1==1)
{
PORTD=0x01; PORTA=number[a];delay_ms(2);
PORTD=0x02; PORTA=number[b];delay_ms(2);
}
if(en2==1)
{
PORTD=0x04; PORTA=number[c];delay_ms(2);
PORTD=0x08; PORTA=number[d];delay_ms(2);
}
if(en3==1)
{
PORTD=0x10; PORTA=number[e];delay_ms(2);
PORTD=0x20; PORTA=number[f];delay_ms(2);
}
if(s==0 & PINC.1==0)
{
if(j!=400)
j=400;
en1=1;
en2=0;
en3=0;
}
} // end of for
if(en1==1 & en2==1 & en3==1)
{
a++;
if(a>9){a=0; b++;
if(b>=6){b=0; c++;
if(c>9){c=0; d++;
if(d>=6){d=0; e++;
if((e>9)|(f>=2 & e>=4)){e=0; f++;
if((f>=2 & e>=4)|(f>2))
{ f=0; e=0; }
} } } } }
}
}
} // end of interrupt